package com.neuedu.corejava.ch7.abs;

/**
 * 1.使用abstract修饰的方法叫抽象方法，抽象的方法没有方法体（没有大括号） 2.一个类如果包含有抽象方法，则这个类必须是抽象类
 * 注意：抽象类不一定包含抽象方法，即抽象类可以不包含抽象方法 3.在抽象类中，可以同时包含抽象方法和非抽像方法 4.抽象不能使用new关键词进行实例化
 * 5.子类必须实现或重写父类定义的抽象方法：即当需要子类重写方法或实现方法时 可以把特定的方法声明为抽象方法（对应的类就是抽象类）
 * 6.一个子类继承了一个抽象类，也会继承父类的抽象方法，如果父类包含有抽象方法， 则子类必须实现该抽象方法（当子类也是抽象类除外）
 * 
 * @author admin
 *
 */
//使用abstract修饰的类叫抽象类，抽象类不能被实例化
//final和abstract不能同时修饰类
//使用final修饰的类称为终结类，终结类不能被继承，不能有子类 
public abstract class AbstractClass {
	// 使用final修饰的"变量"，成为常量
	// 常量就是在运行过程中，不能被修改的“变量”
	// 属性常量需要在定义时需要初始化，常量一旦被初始化就不能被修改
	// 属性常量如果在定义时没有进行初始化，则可以在构造方法中初始化一次
	private int id;
	private String name;
	// 类属性（使用static 修饰的属性）必须在定义时进行初始化，一旦被初始化则不能被修改（引用不能被修改）
	private static final String MAN = "男";

	// 抽象方法：修饰符号 abstract 返回值类型 方法名（参数列表）；没有方法体
	// 抽象方法不能使用private关键词进行修饰，其它三个访问修饰符号可以
	// 抽象方法不能使用static关键词进行修饰，
	// 抽象方法不能使用final关键词进行修饰，final修饰的方法不能被重写，修饰的类不能被继承
	public abstract void absMethod();

	// 使用final修饰的方法称为终结方法，终结方法不能被重写
	public final void Method() {

	}

	// final修饰的局部变量或参数，不能被修改
	public AbstractClass(final int id, final String name) {
		super();
		final int d;
		d = 12;
		// d=14;错误，局部变量一旦被赋值，则不能进行修改
		this.id = id;
		this.name = name;
	}
 
	public AbstractClass() {
		super();
		// TODO Auto-generated constructor stub
	}
 
	public static void main(String[] args) {
		// 抽象类一般由非抽象的子类实例化，多态编程
		AbstractClass abstractClass = new SubAbstractClass();
		abstractClass.absMethod();// 功能是子类继承的方法产生的

	}

}
